home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 9 / The PC-SIG Library on CD ROM - Ninth Edition.iso / 1701_800 / DISK1713 / DISK1713.ZIP / QBSCR4.DOC < prev    next >
Text File  |  1990-04-11  |  74KB  |  1,949 lines

  1.  
  2.  
  3.  
  4.          Subprogram PUTSCREEN
  5.          -------------------------------------------------------------
  6.  
  7.                    Purpose:  The  PutScreen routine will retrieve from
  8.                    disk  a  premade  screen   file   (generated   with
  9.                    GetScreen  or  Screen  Builder) and place it on the
  10.                    display.  The whole operation  takes  less  than  a
  11.                    second on a hard disk.
  12.  
  13.  
  14.                    Usage: PutScreen file$
  15.  
  16.                              file$ - the disk file that is the  screen
  17.                                      to be displayed
  18.  
  19.  
  20.                    Details:  This  routine  is  the  mechanism whereby
  21.                    screens  that  are  generated  via  the   GetScreen
  22.                    routine or the Screen Builder program are placed on
  23.                    the screen.  Simply make a call to PutScreen and it
  24.                    will  load the file from disk and shove it directly
  25.                    into screen memory.  The  result  is  a  very  fast
  26.                    display of a premade display.
  27.  
  28.                    When you call PutScreen, you send it  the  name  of
  29.                    the  file  that  stores  the  screen  you  want  to
  30.                    display.  PutScreen will quickly display it.  Study
  31.                    the example to see just how easy it is.
  32.  
  33.  
  34.                    Example:  This  example will load a screen that was
  35.                    previously  generated  using  Screen  Builder,  and
  36.                    display  it.  The screen was saved in a file called
  37.                    SCREEN01.CLR.
  38.  
  39.                    ' PutScreen example begins
  40.                    ' Load the screen and display it
  41.                    PutScreen "SCREEN01.CLR"
  42.  
  43.                    ' PutScreen example ends
  44.  
  45.  
  46.                    End User Instructions: None.
  47.  
  48.  
  49.                    Known  Limitations:  Works  only  with QBSCR Screen
  50.                    Builder or GetScreen generated screens.
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.                                                                page 71
  59.  
  60.  
  61.  
  62.  
  63.          Subprogram QBPRINT
  64.          -------------------------------------------------------------
  65.  
  66.                    Purpose:  Provides  an  combination  of  the print,
  67.                    locate, and color statements in one  command.   Use
  68.                    for  the  print  instances  where you need to print
  69.                    characters that PRINT cannot handle, such as  ASCII
  70.                    7, the round bullet.
  71.  
  72.  
  73.                    Usage: QBPrint st$, row%, col%, fore%, back%
  74.  
  75.                              st$ - the string or string expression  to
  76.                                    be printed
  77.                              row% - the row of the  screen  to  locate
  78.                                    the string
  79.                              col% - the column of the screen to locate
  80.                                    the string
  81.                              fore%  - the foreground color in which to
  82.                                    display the string
  83.                              back%  - the background color in which to
  84.                                    display the string
  85.  
  86.  
  87.                    Details: This routine is most useful when you  need
  88.                    to either
  89.  
  90.                         - Display  a  string  that has a  character(s)
  91.                           that the QuickBASIC PRINT  statement  cannot
  92.                           handle, such as ASCII 7 ( CHR$(7) ).  If you
  93.                           try  to say PRINT CHR$(7) to print the round
  94.                           bullet ASCII  character,  the  speaker  will
  95.                           beep instead, since ASCII 7 is also the bell
  96.                           character.
  97.  
  98.                         -  You  want to print something in a different
  99.                           color  without  having  to  issue  a   COLOR
  100.                           statement.  This routine will print a string
  101.                           in  a  different  color without changing the
  102.                           current COLOR setting.
  103.  
  104.                         - You want to print a string without  changing
  105.                           the  current  cursor position.  This routine
  106.                           will print at  an  screen  location  without
  107.                           changing   the   program's   current  cursor
  108.                           position.
  109.  
  110.                    The QBPrint routine can do this because  it  writes
  111.                    your string directly to the display board's memory.
  112.                    That's  why  you can print ASCII 7 as a bullet, put
  113.                    color values into  video  memory  without  changing
  114.                    BASIC's  color  settings, and locate without moving
  115.                    the cursor.
  116.  
  117.                                                                page 72
  118.  
  119.  
  120.  
  121.  
  122.                    QBPrint  supports  all  screen  locations  for  the
  123.                    LOCATE portion of its capability, foreground colors
  124.                    from 0 to 31, and background colors from 0 to 7.
  125.  
  126.  
  127.                    Example: This code segment will  display  a  string
  128.                    expression  on  line  10,  column 25, with a bright
  129.                    white foreground and  a  blue  background.   It  is
  130.                    broken onto two lines due to the column width.
  131.  
  132.                    ' QBPrint example begins
  133.                    ' Print a string with characters only QBPrint
  134.                    ' can handle
  135.                    QBPrint CHR$(7) + " A bulleted string", 10, 25,
  136.                                                            15, 1
  137.  
  138.                    ' QBPrint example ends
  139.  
  140.  
  141.                    End User Instructions: None.
  142.  
  143.  
  144.                    Known Limitations: QBPrint is a little slow when it
  145.                    comes  to printing an entire screen of information.
  146.                    Use it sparingly, and only when necessary.  In this
  147.                    manner, it will be a valuable tool to have around.
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.                                                                page 73
  177.  
  178.  
  179.  
  180.  
  181.          Function SCREENBLANK
  182.          -------------------------------------------------------------
  183.  
  184.                    Purpose:  Provides  a  screen  saver feature to any
  185.                    program to prevent image "burn-in."
  186.  
  187.  
  188.                    Usage: x$ = ScreenBlank$(delay)
  189.  
  190.                                x$ -  Any  string  variable  that  will
  191.                                     contain  the  key that was pressed
  192.                                     during the screen blank.
  193.                                delay  -   A   numerical   value   that
  194.                                     represents  the  amount of time to
  195.                                     wait   between   screen    blanker
  196.                                     message shifts.
  197.  
  198.  
  199.                    Details:  If  your  application  program leaves the
  200.                    same image on the screen for any extended period of
  201.                    time, the image  may  become  "burned  in"  to  the
  202.                    screen.  The result is a ghost image of the display
  203.                    forever  left on the monitor.  To prevent this from
  204.                    happening, you can blank the screen after a defined
  205.                    period of inactivity.  This will prevent the  image
  206.                    from  "burning  in".   However,  if  the user later
  207.                    returns and sees a blank screen, what are  they  to
  208.                    think?   Anything could be wrong with the computer.
  209.                    What we need is a small message on  the  screen  to
  210.                    inform  the  user  that the screen has been blanked
  211.                    out, and they can hit any  key  to  return  to  the
  212.                    program.   That  seems  to  solve  the  problem but
  213.                    there's one twist left: What's to prevent the small
  214.                    message from itself burning into the  screen?   The
  215.                    answer  is  surprisingly easy.  We move the message
  216.                    around on the screen at periodic intervals.  Moving
  217.                    the message, or "bouncing" it, is easy to  do,  and
  218.                    the  ScreenBlank  routine  takes  care of all these
  219.                    features for you.
  220.  
  221.                    When  you call ScreenBlank, it is assumed that your
  222.                    program has determined that a period of  inactivity
  223.                    of  sufficient  duration  has  elapsed.  The  delay
  224.                    parameter is a counter.  The larger the value,  the
  225.                    longer  the  wait  between  the  movements  of  the
  226.                    ScreenBlank message.  A value of 100,000 is roughly
  227.                    equal to 3 minutes on a 6 MHz AT-class machine. You
  228.                    can experiment with the delay to see what suits you
  229.                    and your machine.
  230.  
  231.  
  232.  
  233.  
  234.  
  235.                                                                page 74
  236.  
  237.  
  238.  
  239.  
  240.                    Example:  This example assumes you are checking for
  241.                    activity in your program.  The code that you  would
  242.                    execute  if  activity  occurs is only commentary in
  243.                    this example.  We are representing  the  main  loop
  244.                    for  any  program here.  The example checks for any
  245.                    user activity (usually keystrokes).   If  there  is
  246.                    something  to  do,  it executes any code necessary.
  247.                    Otherwise, it increments a  counter  we  are  using
  248.                    called wait.  The wait counter is used to determine
  249.                    if  the  desired  period of inactivity has elapsed.
  250.                    If wait ever reaches our preset limit, we  go  into
  251.                    the  ScreenBlank.   The  key pressed by the user to
  252.                    exit the ScreenBlank is stored in x$, but since  we
  253.                    don't need it here we'll just ignore it.
  254.  
  255.                    ' ScreenBlank example begins
  256.                    ' Now sitting in some kind of loop
  257.                    wait = 0: maxWait = 100000
  258.                    DO
  259.                        IF AnyUserActivity THEN
  260.                            ' Execute any code necessary
  261.                            wait = 0
  262.                        ELSE
  263.                            wait = wait + 1
  264.                            IF wait > maxWait then
  265.                                wait = 0
  266.                                x$ = ScreenBlank$(50000)
  267.                            END IF   ' wait > maxWait
  268.                        END IF   ' AnyUserActivity
  269.                    LOOP UNTIL UserQuits
  270.                    ' ScreenBlank example ends
  271.  
  272.  
  273.                    End User Instruction: To return to the main program
  274.                    (i.e.,  to exit the ScreenBlank function), the user
  275.                    can hit any key.
  276.  
  277.  
  278.                    Known  Limitations:  The  delay  counter   uses   a
  279.                    floating  point  value  (single precision real), so
  280.                    the delay parameter is limited to the maximum value
  281.                    for single precision reals.
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.                                                                page 75
  295.  
  296.  
  297.  
  298.  
  299.          Subprogram SCRNRESTORE
  300.          -------------------------------------------------------------
  301.  
  302.                    Purpose: To restore a portion or all of the  screen
  303.                    saved with the QBSCR SCRNSAVE routine.
  304.  
  305.  
  306.                    Usage: ScrnRestore firstLine%, lastLine%,
  307.                                       scrArray%(), segment
  308.  
  309.                                firstLine%  -  The  first  line  of the
  310.                                     screen to restore.
  311.                                lastLine% - The last line of the screen
  312.                                     to restore.
  313.                                scrArray%() -  An  integer  array  that
  314.                                     stores  the information saved from
  315.                                     the  screen  via  SCRNSAVE.    See
  316.                                     below for more information.
  317.                                segment  -  The  beginning  address  of
  318.                                     video  memory.   Use   the   QBSCR
  319.                                     routine  GETVIDEOSEGMENT to obtain
  320.                                     this.  See below for details.
  321.  
  322.  
  323.                    Details: Before you use  the  SCRNRESTORE  routine,
  324.                    you  have  to  have  something  to  restore  to the
  325.                    screen.  In the normal course of events  you  would
  326.                    save  a  portion  or  all  of  the screen using the
  327.                    SCRNSAVE  routine,  display  something   over   the
  328.                    existing screen like a window, and then restore the
  329.                    screen   when   finished   with  the  window  using
  330.                    SCRNRESTORE.
  331.  
  332.                    To use the SCRNRESTORE routine, we can  assume  you
  333.                    have  saved  a  part  or  all  of the display using
  334.                    SCRNSAVE.  There  are  points  that   need   to  be
  335.                    understood before either the SAVE or RESTORE can be
  336.                    used.   The first is that when you save part of the
  337.                    screen, the  information  saved  is  stored  in  an
  338.                    array.   The array must be an integer array, and it
  339.                    must have 4000  elements.   To  dimension  such  an
  340.                    array, use the following sort of DIM statement:
  341.  
  342.                                    DIM scrArray%(4000)
  343.  
  344.                    This  provides  you  an array in which to store the
  345.                    screen information.  This array is  passed  to  the
  346.                    SCRNRESTORE  (or SAVE) routine, so that that it has
  347.                    something to read from (or store to).
  348.  
  349.                    The  second  concept  of  importance  is  that  the
  350.                    SCRNRESTORE (and SAVE) routine know the location of
  351.  
  352.  
  353.                                                                page 76
  354.  
  355.  
  356.  
  357.  
  358.                    the beginning of the video card  memory.   This  is
  359.                    simply a value, and it can easily be obtained using
  360.                    the  GETVIDEOSEGMENT function in the QBSCR package.
  361.                    All you have to do is obtain a segment value  using
  362.                    this function, like this:
  363.  
  364.                                 segment = GetVideoSegment
  365.  
  366.                    And   then   pass  the  segment  parameter  to  the
  367.                    SCRNRESTORE (or SAVE) routine, like this:
  368.  
  369.                          ScrnRestore 1, 25, scrArray%(), segment
  370.  
  371.                    The first and last lines specify the range of lines
  372.                    on the screen to actually save.  The example  above
  373.                    would  save the entire screen (lines 1 through 25).
  374.                    See the example below for usage.
  375.  
  376.  
  377.                    Example: This example uses the SCRNSAVE routine  to
  378.                    save  a  part  of  the screen.  An error message is
  379.                    then  displayed  over  the  screen.   Finally,  the
  380.                    screen  is  restored with SCRNRESTORE when the user
  381.                    hits a key.
  382.  
  383.                    ' ScrnRestore example begins
  384.                    ' Dimension an array to store the screen contents
  385.                    DIM scrArray%(4000)
  386.  
  387.                    ' Assign first and last line parameters for both
  388.                    ' SAVE and RESTORE (they are the same).  Saving
  389.                    ' only the lines that will be overwritten by the
  390.                    ' error message.
  391.                    first% = 11
  392.                    last% = 15
  393.  
  394.                    ' Obtain the proper video memory segment
  395.                    segment = GetVideoSegment
  396.  
  397.                    ' Save the designated portion of the screen
  398.                    ScrnSave first%, last%, scrArray%(), segment
  399.  
  400.                    ' Display the error message - this code commented
  401.                    ' out.  You would display something on the screen
  402.                    ' on lines 11 through 15.
  403.  
  404.                    ' Wait for a keypress.
  405.                    keyPress$ = INPUT$(1)
  406.  
  407.                    ' Restore the screen after the user hits a key.
  408.                    ScrnRestore first%, last%, scrArray%(), segment
  409.  
  410.                    ' ScrnRestore example ends
  411.  
  412.                                                                page 77
  413.  
  414.  
  415.  
  416.  
  417.                    For more information in the form of  examples,  see
  418.                    the  source  code  for  the  DEMO  program  or  the
  419.                    Techniques section of this manual.
  420.  
  421.  
  422.                    End User Instructions: None.
  423.  
  424.  
  425.                    Known Limitations: None.
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.                                                                page 78
  472.  
  473.  
  474.  
  475.  
  476.          Subprogram SCRNSAVE
  477.          -------------------------------------------------------------
  478.  
  479.                    Purpose:  To  save  a  portion or all of the screen
  480.                    before overwriting it with something else.
  481.  
  482.  
  483.                    Usage: ScrnSave firstLine%, lastLine%,
  484.                                       scrArray%(), segment
  485.  
  486.                                firstLine%  -  The  first  line  of the
  487.                                     screen to save.
  488.                                lastLine% - The last line of the screen
  489.                                     to save.
  490.                                scrArray%() -  An  integer  array  that
  491.                                     stores  the information saved from
  492.                                     the  screen.
  493.                                segment  -  The  beginning  address  of
  494.                                     video  memory.   Use   the   QBSCR
  495.                                     routine  GETVIDEOSEGMENT to obtain
  496.                                     this.  See below for details.
  497.  
  498.  
  499.                    Details: In the normal course of events  you  would
  500.                    save  a  portion  or  all  of  the screen using the
  501.                    SCRNSAVE  routine,  display  something   over   the
  502.                    existing screen like a window, and then restore the
  503.                    screen   when   finished   with  the  window  using
  504.                    SCRNRESTORE.
  505.  
  506.                    There are points that need to be understood  before
  507.                    either  the SAVE or RESTORE can be used.  The first
  508.                    is that when you  save  part  of  the  screen,  the
  509.                    information saved is stored in an array.  The array
  510.                    must  be  an  integer  array, and it must have 4000
  511.                    elements.  To dimension  such  an  array,  use  the
  512.                    following sort of DIM statement:
  513.  
  514.                                    DIM scrArray%(4000)
  515.  
  516.                    This  provides  you  an  array  to store the screen
  517.                    information.   This  array   is   passed   to   the
  518.                    SCRNSAVE  (or RESTORE) routine, so that that it has
  519.                    something in which to save the screen information.
  520.  
  521.                    The  second  concept  of  importance  is  that  the
  522.                    SCRNSAVE (and RESTORE) routine know the location of
  523.                    the beginning of the video card  memory.   This  is
  524.                    simply a value, and it can easily be obtained using
  525.                    the  GETVIDEOSEGMENT function in the QBSCR package.
  526.                    All you have to do is obtain a segment value  using
  527.                    this function, like this:
  528.  
  529.  
  530.                                                                page 79
  531.  
  532.  
  533.  
  534.  
  535.                                 segment = GetVideoSegment
  536.  
  537.                    And   then   pass  the  segment  parameter  to  the
  538.                    SCRNSAVE (or RESTORE) routine, like this:
  539.  
  540.                           ScrnSave 1, 25, scrArray%(), segment
  541.  
  542.                    The first and last lines specify the range of lines
  543.                    on the screen to actually save.  The example  above
  544.                    would  save the entire screen (lines 1 through 25).
  545.                    See the example below for usage.
  546.  
  547.  
  548.                    Example:  This example uses the SCRNSAVE routine to
  549.                    save a part of the screen.   An  error  message  is
  550.                    then  displayed  over  the  screen.   Finally,  the
  551.                    screen is restored with SCRNRESTORE when  the  user
  552.                    hits a key.
  553.  
  554.                    ' ScrnSave example begins
  555.                    ' Dimension an array to store the screen contents
  556.                    DIM scrArray%(4000)
  557.  
  558.                    ' Assign first and last line parameters for both
  559.                    ' SAVE and RESTORE (they are the same).  Saving
  560.                    ' only the lines that will be overwritten by the
  561.                    ' error message.
  562.                    first% = 11
  563.                    last% = 15
  564.  
  565.                    ' Obtain the proper video memory segment
  566.                    segment = GetVideoSegment
  567.  
  568.                    ' Save the designated portion of the screen
  569.                    ScrnSave first%, last%, scrArray%(), segment
  570.  
  571.                    ' Display the error message - this code commented
  572.                    ' out.  You would display something on the screen
  573.                    ' on lines 11 through 15.
  574.  
  575.                    ' Wait for a keypress.
  576.                    keyPress$ = INPUT$(1)
  577.  
  578.                    ' Restore the screen after the user hits a key.
  579.                    ScrnRestore first%, last%, scrArray%(), segment
  580.  
  581.                    ' ScrnSave example ends
  582.  
  583.                    For  more  information in the form of examples, see
  584.                    the  source  code  for  the  DEMO  program  or  the
  585.                    Techniques section of this manual.
  586.  
  587.  
  588.  
  589.                                                                page 80
  590.  
  591.  
  592.  
  593.  
  594.                    End User Instructions: None.
  595.  
  596.  
  597.                    Known Limitations: None.
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.                                                                page 81
  649.  
  650.  
  651.  
  652.  
  653.          Function SELECTLIST
  654.          -------------------------------------------------------------
  655.  
  656.                    Purpose:  The  SelectList function accepts an array
  657.                    of strings and creates from  it  a  scrolling  list
  658.                    with  selection  bar.   The user may scroll through
  659.                    the list  and  select  one  of  the  choices.   The
  660.                    function returns the user selection as a string.
  661.  
  662.  
  663.                    Usage: choice$ = SelectList$(items$(), numItems%,
  664.                                         topRow%, botRow%, leftCol%,
  665.                                         maxWidth%, normFG%, normBG%,
  666.                                         hiFG%, hiBG%)
  667.  
  668.                                 items$()  -  a string array containing
  669.                                            the items in the list  from
  670.                                            which  a  selection will be
  671.                                            made
  672.                                 numItems% - The number of items in the
  673.                                            list
  674.                                 topRow% -  the  top-most  row  of  the
  675.                                            screen  on  which  the list
  676.                                            will be displayed
  677.                                 botRow% - The bottom-most row  of  the
  678.                                            screen  on  which  the list
  679.                                            will be displayed
  680.                                 leftCol% -  The  left-most  column  of
  681.                                            the  screen  on  which  the
  682.                                            list will be displayed
  683.                                 maxWidth% - The length of the  longest
  684.                                            string in the list
  685.                                 normFG%  -  The  foreground  color  of
  686.                                            normal list choices
  687.                                 normBG%  -  The  background  color  of
  688.                                            normal list entries
  689.                                 hiFG%  -  The  foreground color of the
  690.                                            highlighted list entry
  691.                                 hiBG% - The background  color  of  the
  692.                                            highlighted list entry
  693.  
  694.  
  695.                    Details:   With  this  function,  you  can  make  a
  696.                    scrolling selection list from  almost  any  set  of
  697.                    string    data,    such   as   file   names.    The
  698.                    possibilities  all  depend  on the functionality of
  699.                    your program.
  700.  
  701.                    The basic steps to setting up a scrolling selection
  702.                    list are
  703.  
  704.                         1) DIMension an array to hold list choices
  705.  
  706.  
  707.                                                                page 82
  708.  
  709.  
  710.  
  711.  
  712.                         2) Fill in list choices in the array
  713.  
  714.                         3) Call SelectList
  715.  
  716.                         4) Use the value returned by SelectList
  717.  
  718.                    Let's  step  through  the  procees  in  detail   by
  719.                    contriving  an  example.   We  will  using  as  our
  720.                    example  the  color setup portion of a program.  We
  721.                    will be presenting to the user a scrolling list  of
  722.                    color  choices.  There are sixteen possible colors,
  723.                    and we only have room on our  display  for  a  list
  724.                    that  is 8 lines in height.  Therefore, a scrolling
  725.                    list will be just the ticket.
  726.  
  727.                    Step 1: Dimension an array  to  hold  our  list  of
  728.                    choices.   This  can  be  done  in a second or two.
  729.                    Simply DIM a string array with the  maximum  number
  730.                    of  list  entries.  In our example, we have sixteen
  731.                    possible choices, so our code would look like  this
  732.                    in QuickBASIC:
  733.  
  734.                                 maxChoices% = 16
  735.                                 DIM colors$(maxChoices%)
  736.  
  737.                    Step  2:  Fill  in the choices in the array we just
  738.                    created.  This is the only vaguely tedious part  of
  739.                    making  a  list, but you'd have to type them in one
  740.                    way or another.  Fill in  our  color  choices  like
  741.                    this:
  742.  
  743.                                 colors$(1) = "Black"
  744.                                 colors$(2) = "Blue"
  745.                                 colors$(3) = "Green"
  746.                                 colors$(4) = "Cyan"
  747.                                 colors$(5) = "Red"
  748.                                 colors$(6) = "Magenta"
  749.                                 colors$(7) = "Brown"
  750.                                 colors$(8) = "White"
  751.                                 colors$(9) = "Dark Gray"
  752.                                 colors$(10) = "Bright Blue"
  753.                                 colors$(11) = "Bright Green"
  754.                                 colors$(12) = "Bright Cyan"
  755.                                 colors$(13) = "Bright Red"
  756.                                 colors$(14) = "Bright Magenta"
  757.                                 colors$(15) = "Yellow"
  758.                                 colors$(16) = "Bright White"
  759.  
  760.                    Step 3: Make the call to SelectList.   We  need  to
  761.                    tell SelectList some additional information as well
  762.                    the  list  itself.   It needs to know the number of
  763.  
  764.  
  765.  
  766.                                                                page 83
  767.  
  768.  
  769.  
  770.  
  771.                    items in the list (16), the width  of  the  longest
  772.                    choice  (Bright  Magenta, 14 characters), and where
  773.                    we want it on the  screen.   We'll  be  placing  it
  774.                    between  rows  11  and  16.  This provides only six
  775.                    lines for the list, but we have to  allow  for  the
  776.                    top and bottom lines of the window we'll be placing
  777.                    it in.  The list will start at column 10.  The list
  778.                    be  have  a  foreground  color  of bright white and
  779.                    background color  of  red,  while  the  highlighted
  780.                    entry  will  be  yellow  on a black background. So,
  781.                    we'll be making a window first to place the list in
  782.                    (using MakeWindow), and  then  calling  SelectList.
  783.                    Our QuickBASIC code looks like this:
  784.  
  785.                    ' Make a window for the list
  786.                    MakeWindow 10, 9, 17, 26, 15, 4, 0, 0, -1, 0, ""
  787.  
  788.                    ' Call SelectList
  789.                    colorChoice$ = SelectList$(colors$(), maxChoices%,
  790.                                   11, 16, 10, 14, 15, 4, 14, 0)
  791.  
  792.                    SelectList  now  takes over and the user may select
  793.                    which color they would like.  Once a  color  choice
  794.                    is  made,  the string chosen is returned and stored
  795.                    in colorChoice$.  If the user hit ESC and no choice
  796.                    was made, SelectList will return a nul string ("").
  797.  
  798.                    Make  sure  to  look  at  the  notes  on  End  User
  799.                    Instructions to see all the movement capabilites of
  800.                    SelectList.
  801.  
  802.  
  803.                    Example: This example will simply pull together our
  804.                    above example.
  805.  
  806.                    ' SelectList example begins
  807.                    ' DIMension an array to store list choices
  808.                    maxChoices% = 16
  809.                    DIM colors$(maxChoices%)
  810.  
  811.                    ' Fill in the choices in the array
  812.                    colors$(1) = "Black"
  813.                    colors$(2) = "Blue"
  814.                    colors$(3) = "Green"
  815.                    colors$(4) = "Cyan"
  816.                    colors$(5) = "Red"
  817.                    colors$(6) = "Magenta"
  818.                    colors$(7) = "Brown"
  819.                    colors$(8) = "White"
  820.                    colors$(9) = "Dark Gray"
  821.                    colors$(10) = "Bright Blue"
  822.  
  823.  
  824.  
  825.                                                                page 84
  826.  
  827.  
  828.  
  829.  
  830.                    colors$(11) = "Bright Green"
  831.                    colors$(12) = "Bright Cyan"
  832.                    colors$(13) = "Bright Red"
  833.                    colors$(14) = "Bright Magenta"
  834.                    colors$(15) = "Yellow"
  835.                    colors$(16) = "Bright White"
  836.  
  837.                    ' Make a window for the list
  838.                    MakeWindow 10, 9, 17, 26, 15, 4, 0, 0, -1, 0, ""
  839.  
  840.                    ' Call SelectList
  841.                    colorChoice$ = SelectList$(colors$(), maxChoices%,
  842.                                   11, 16, 10, 14, 15, 4, 14, 0)
  843.  
  844.                    ' You could now do whatever you wanted to with the
  845.                    ' User's selection.
  846.  
  847.                    ' SelectList example ends
  848.  
  849.  
  850.                    End  User  Instructions:  SelectList has a complete
  851.                    host of movement operations available to the  user.
  852.                    The  following  table lists the operations provided
  853.                    and the keys used to execute them.
  854.  
  855.                    SelectList Operation...                  ...Key(s)
  856.                    --------------------------------------------------
  857.                    Move list/highlight up one line  . . . .  Up Arrow
  858.                    Move list/highlight down one line  . .  Down Arrow
  859.                    Move list/highlight up one screen  . . . . .  PgUp
  860.                    Move list/highlight down one screen  . . . .  PgDn
  861.                    Move list/highlight to top of list . . . . .  Home
  862.                    Move list/highlight to bottom of list  . . . . End
  863.                    Select highlighted choice  . . . . . . . . . Enter
  864.                    Abort selection  . . . . . . . . . . . . . . . Esc
  865.  
  866.                    The user may also hit any letter or number key.  If
  867.                    there is a choice in the list whose first character
  868.                    is the same as the letter/number hit, the highlight
  869.                    and list will move immediately to it.
  870.  
  871.  
  872.                    Known  Limitations: String entries in the list must
  873.                    be 78 characters or less in  length.   The  maximum
  874.                    visible  portion  of the list is the entire screen.
  875.                    Number of entries is limited  by  available  string
  876.                    space in your program.
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.                                                                page 85
  885.  
  886.  
  887.  
  888.  
  889.          Subprogram VIEWLIST
  890.          -------------------------------------------------------------
  891.  
  892.                    Purpose:  Provides  a scrolling list of text on the
  893.                    screen from a passed in string array.
  894.  
  895.  
  896.                    Usage: ViewList list$(), listLen%, maxWidth%,
  897.                                 topRow%, botRow%, leftCol%, fg%, bg%
  898.  
  899.                                 list$() - The array of strings  to  be
  900.                                            treated as a scrolling list
  901.                                 listLen%  - The number of lines in the
  902.                                            list   (elements   in   the
  903.                                            string array)
  904.                                 maxWidth%  -  The width of the longest
  905.                                            string in the array
  906.                                 topRow% -  The  top-most  row  of  the
  907.                                            screen  on  which  the list
  908.                                            will be displayed
  909.                                 botRow% - The bottom-most row  of  the
  910.                                            screen  on  which  the list
  911.                                            will be displayed
  912.                                 leftCol% - The left-most column of the
  913.                                            screen on  which  the  list
  914.                                            will be displayed
  915.                                 fg% - The foreground color of the list
  916.                                 bg% - The background color of the list
  917.  
  918.  
  919.                    Details: ViewList  creates,  from  a  string  array
  920.                    passed  in,  a  scrolling  list of text with a full
  921.                    compliment of movement operations.  The basic steps
  922.                    involved in creating a scrolling list are:
  923.  
  924.                         1) DIMension an array to hold the text
  925.  
  926.                         2) Fill the array with text
  927.  
  928.                         3) Call ViewList
  929.  
  930.                    To  explain the workings of ViewList, we'll make up
  931.                    an example to go through. Our  example  will  be  a
  932.                    help  text viewer.  We will use viewlist to display
  933.                    a small window in which help text may be  scrolled.
  934.                    Our  window  and  text  will  be  yellow  on a blue
  935.                    background, will be positioned between rows  5  and
  936.                    10  on  the  screen,  and  will be about 40 columns
  937.                    wide.
  938.  
  939.  
  940.  
  941.  
  942.  
  943.                                                                page 86
  944.  
  945.  
  946.  
  947.  
  948.                    Step 1: DIMension an array to hold  the  text.   We
  949.                    need a string array to hold the text to be scrolled
  950.                    through.   Assume  our text will be no more than 25
  951.                    lines.  Our QuickBASIC code will look like this:
  952.  
  953.                                    maxLines% = 25
  954.                                    DIM txt$(maxLines%)
  955.  
  956.  
  957.                    Step 2: Fill the array with text.  This is the part
  958.                    where we do the bulky typing.  You could enter  the
  959.                    text  and  store it permanently in your program (as
  960.                    we will in this example), or you could read  it  in
  961.                    from  a  data  file  on disk.  The disk file method
  962.                    will save you a great deal  of  string  space,  but
  963.                    will  be  somewhat slower, as it takes time to read
  964.                    from disk.
  965.  
  966.                         txt$(1) = "This help text is designed to"
  967.                         txt$(2) = "guide you through the process"
  968.                         txt$(3) = "of installing the QBSCR Screen"
  969.                         txt$(4) = "Routines on your hard disk."
  970.                         txt$(5) = ""
  971.                         txt$(6) = "Step 1: Make a subdirectory on"
  972.                         txt$(7) = "your hard disk.  You can call"
  973.                         txt$(8) = "it whatever you like.  In this"
  974.                         txt$(9) = "example, it will be C:\QBSCR."
  975.                         txt$(10) = "The DOS command looks like"
  976.                         txt$(11) = "this: MD C:\QBSCR"
  977.                         txt$(12) = ""
  978.                         txt$(13) = "Step 2: Copy all the files"
  979.                         txt$(14) = "from the distribution disks"
  980.                         txt$(15) = "to the subdirectory you made"
  981.                         txt$(16) = "in step 1.  The DOS command"
  982.                         txt$(17) = "for our example, assuming the"
  983.                         txt$(18) = "floppy drive is A: would be:"
  984.                         txt$(19) = "COPY A:*.* C:\QBSCR"
  985.                         txt$(20) = ""
  986.                         txt$(21) = "Step 3: Repeat this process"
  987.                         txt$(22) = "for each of the QBSCR disks."
  988.                         txt$(23) = ""
  989.                         txt$(24) = "Once this is done, QBSCR is"
  990.                         txt$(25) = "ready to go!"
  991.  
  992.                    Step 3:  Make  the  call  to  ViewList.   A  single
  993.                    statement  at  this  point calls ViewList to create
  994.                    the scrolling list.  First, however, we will make a
  995.                    window in which the  list  will  be  placed,  using
  996.                    MakeWindow.
  997.  
  998.                         ' Make a window for the help text
  999.                         MakeWindow 5, 5, 10, 45, 14, 1, 0, 0, -1, 0,
  1000.                                 " Installation Help "
  1001.  
  1002.                                                                page 87
  1003.  
  1004.  
  1005.  
  1006.  
  1007.                         ' Call ViewList
  1008.                         ViewList txt$(), maxLines%, 36, 11, 14, 6,
  1009.                                 14, 1
  1010.  
  1011.                    From  this point, ViewList is in control.  Once the
  1012.                    usert hits ESC to quit, control is returned to your
  1013.                    calling routine.  Nothing is returned or changed.
  1014.  
  1015.  
  1016.                    Example: This example will simply pull together our
  1017.                    above example into one piece.
  1018.  
  1019.                    ' ViewList example begins
  1020.                    ' DIMension an array to hold text
  1021.                    maxLines% = 25
  1022.                    DIM txt$(maxLines%)
  1023.  
  1024.                    ' Fill the array with the text to view
  1025.                    txt$(1) = "This help text is designed to"
  1026.                    txt$(2) = "guide you through the process"
  1027.                    txt$(3) = "of installing the QBSCR Screen"
  1028.                    txt$(4) = "Routines on your hard disk."
  1029.                    txt$(5) = ""
  1030.                    txt$(6) = "Step 1: Make a subdirectory on"
  1031.                    txt$(7) = "your hard disk.  You can call"
  1032.                    txt$(8) = "it whatever you like.  In this"
  1033.                    txt$(9) = "example, it will be C:\QBSCR."
  1034.                    txt$(10) = "The DOS command looks like"
  1035.                    txt$(11) = "this: MD C:\QBSCR"
  1036.                    txt$(12) = ""
  1037.                    txt$(13) = "Step 2: Copy all the files"
  1038.                    txt$(14) = "from the distribution disks"
  1039.                    txt$(15) = "to the subdirectory you made"
  1040.                    txt$(16) = "in step 1.  The DOS command"
  1041.                    txt$(17) = "for our example, assuming the"
  1042.                    txt$(18) = "floppy drive is A: would be:"
  1043.                    txt$(19) = "COPY A:*.* C:\QBSCR"
  1044.                    txt$(20) = ""
  1045.                    txt$(21) = "Step 3: Repeat this process"
  1046.                    txt$(22) = "for each of the QBSCR disks."
  1047.                    txt$(23) = ""
  1048.                    txt$(24) = "Once this is done, QBSCR is"
  1049.                    txt$(25) = "ready to go!"
  1050.  
  1051.                    ' Make a window for the help text
  1052.                    MakeWindow 5, 5, 10, 45, 14, 1, 0, 0, -1, 0,
  1053.                         " Installation Help "
  1054.  
  1055.                    ' Call ViewList
  1056.                    ViewList txt$(), maxLines%, 36, 11, 14, 6,
  1057.                         14, 1
  1058.  
  1059.                    ' ViewList example ends
  1060.  
  1061.                                                                page 88
  1062.  
  1063.  
  1064.  
  1065.  
  1066.                    End  User   Instructions:   ViewList   provides   a
  1067.                    comprehensive  set  of  movement  commands  for the
  1068.                    user.  The following list describes the  operations
  1069.                    available as well as the keys that execute them.
  1070.  
  1071.                    Opeartion...                              ...Key(s)
  1072.                    ---------------------------------------------------
  1073.                    Move up one line . . . . . . . . . . . . . Up Arrow
  1074.                    Move down one line . . . . . . . . . . . Down Arrow
  1075.                    Move up one screen . . . . . . . . . . . . . . PgUp
  1076.                    Move down one screen . . . . . . . . .  Enter, PgDn
  1077.                    Move to top of list  . . . . . . . . . . . . . Home
  1078.                    Move to end of list  . . . . . . . . . . . . .  End
  1079.                    Abort viewing  . . . . . . . . . . . . . . . .  Esc
  1080.  
  1081.  
  1082.                    Known  Limitations:  The amount of text that can be
  1083.                    displayed is limited by  the  amount  of  available
  1084.                    string space.
  1085.  
  1086.  
  1087.  
  1088.  
  1089.  
  1090.  
  1091.  
  1092.  
  1093.  
  1094.  
  1095.  
  1096.  
  1097.  
  1098.  
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111.  
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.                                                                page 89
  1121.  
  1122.  
  1123.  
  1124.  
  1125.          Subprogram WIPE
  1126.          -------------------------------------------------------------
  1127.  
  1128.                    Purpose:  To  clear a programmer-defined portion of
  1129.                    the screen.
  1130.  
  1131.  
  1132.                    Usage: Wipe top%, bottom%, lft%, rght%, back%
  1133.  
  1134.                                top% - The top-most row to clear
  1135.                                bottom% - The bottom-most row to clear
  1136.                                lft% - The left-most column to clear
  1137.                                rght% - The right-most column to clear
  1138.                                back  -  The  background  color   with
  1139.                                     which to clear the screen.
  1140.  
  1141.  
  1142.                    Details: The Wipe routine is used to clear selected
  1143.                    portions of the screen.  It is particularly  useful
  1144.                    for  clearing the contents from existing windows so
  1145.                    that they can be reused.
  1146.  
  1147.                    All you need do to use Wipe is to specify the left,
  1148.                    right,  top,  and   bottom   coordinates   of   the
  1149.                    rectangular  area to clear.  Wipe will always clear
  1150.                    the INSIDE of  the  area  you  specify.   In  other
  1151.                    words, if you tell it to clear an area where
  1152.  
  1153.                                         top% = 5
  1154.                                       bottom% = 10
  1155.                                         lft% = 10
  1156.                                        rght% = 70
  1157.  
  1158.                    Wipe would actually clear an area of
  1159.  
  1160.                                         top% = 6
  1161.                                        bottom% = 9
  1162.                                         lft% = 11
  1163.                                        rght% = 69
  1164.  
  1165.                    It  does this so that if you have a window to clear
  1166.                    out, you can call Wipe with the same coordinates as
  1167.                    your window without  erasing  your  screen  border.
  1168.                    Makes using Wipe much easier.
  1169.  
  1170.                    The back% parameter indicates the color to use when
  1171.                    clearing  out  the  defined area, and should be the
  1172.                    same color as the existing background.
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.                                                                page 90
  1180.  
  1181.  
  1182.  
  1183.  
  1184.                    Example: The following example will assume we  have
  1185.                    a  window  at  the above listed coordinates, and we
  1186.                    wish to clear it out  for  reuse.   The  background
  1187.                    color of this window is blue.
  1188.  
  1189.                    ' Wipe example begins
  1190.                    ' Set our parameter variables for area to clear
  1191.                    top% = 5
  1192.                    bottom% = 10
  1193.                    lft% = 10
  1194.                    right% = 70
  1195.  
  1196.                    ' Set our background color with which to clear
  1197.                    back% = 1   ' Blue
  1198.  
  1199.                    ' Wipe the area clear
  1200.                    Wipe top%, bottom%, lft%, rght%, back%
  1201.  
  1202.                    ' Wipe example ends
  1203.  
  1204.  
  1205.                    End User Instructions: None.
  1206.  
  1207.  
  1208.                    Known Limitations: None.
  1209.  
  1210.  
  1211.  
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237.  
  1238.                                                                page 91
  1239.  
  1240.  
  1241.  
  1242.  
  1243.          Techniques for Using QBSCR
  1244.          -------------------------------------------------------------
  1245.  
  1246.                    Since  providing  documentation  for  the  routines
  1247.                    won't tell you how to perform specific tasks,  this
  1248.                    manual  has  this section which details some of the
  1249.                    techniques possible with the QBSCR routines.
  1250.  
  1251.                    The  techniques  described  in  here  will not only
  1252.                    clarify the usage of some of the routines, but will
  1253.                    also show  you  how  to  combine  the  routines  to
  1254.                    accomplish  specific  tasks.  These techniques will
  1255.                    add professionalism to any program that yearns  for
  1256.                    it.
  1257.  
  1258.                    Simply choose the section you have interest in, and
  1259.                    the   documentation  will  attempt  to  detail  the
  1260.                    technique in terms of why it is used, what  it  can
  1261.                    do for you, and how to do it.
  1262.  
  1263.  
  1264.  
  1265.  
  1266.  
  1267.  
  1268.  
  1269.  
  1270.  
  1271.  
  1272.  
  1273.  
  1274.  
  1275.  
  1276.  
  1277.  
  1278.  
  1279.  
  1280.  
  1281.  
  1282.  
  1283.  
  1284.  
  1285.  
  1286.  
  1287.  
  1288.  
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297.                                                                page 92
  1298.  
  1299.  
  1300.  
  1301.  
  1302.          Displaying and Popping a Window from the Screen
  1303.          -------------------------------------------------------------
  1304.  
  1305.                    Many   programs   add   professionalism   to  their
  1306.                    appearance using this technique.  The effect can be
  1307.                    described as laying a window on top of an  existing
  1308.                    display  and when its usefulness has elapsed, it is
  1309.                    "popped," or quickly removed from the  screen,  and
  1310.                    the  underlying display remains intact.  While this
  1311.                    is what appears to happen, the mechanics are a  bit
  1312.                    different.
  1313.  
  1314.                    This is what actually happens:
  1315.  
  1316.                         1) The initial display exists on the screen.
  1317.  
  1318.                         2) The contents  of  the  video  card  memory,
  1319.                            which  contains  the text on the screen and
  1320.                            the color attribute of each  character,  is
  1321.                            saved  inside  the program (in our case, in
  1322.                            an integer array).
  1323.  
  1324.                         3) The new window is is written to the display
  1325.                            overwriting  and  destroying the portion of
  1326.                            the display it now occupies.
  1327.  
  1328.                         4) When the window is to be removed or  popped
  1329.                            from  the  screen, what actually happens is
  1330.                            that the contents of the video memory saved
  1331.                            in  step  2  before  the  new  window   was
  1332.                            displayed  is now restored to video memory.
  1333.                            This causes the old saved information to be
  1334.                            redisplayed.
  1335.  
  1336.                    The window has been effectively displayed and  then
  1337.                    popped  from  the  display  when  it  was no longer
  1338.                    needed.  We can easily perform this task  with  the
  1339.                    QBSCR  Screen Routines.  Specifically, we will need
  1340.                    the  services  of  the  SCRNSAVE,  MAKEWINDOW,  and
  1341.                    SCRNRESTORE   routines.    The   same  step-by-step
  1342.                    process above applies here:
  1343.  
  1344.                         1) Display the initial screen.   This  can  be
  1345.                            displayed   during  the  normal  course  of
  1346.                            program execution.   Any  existing  display
  1347.                            can be saved/restored.
  1348.  
  1349.                         2) Save  the  screen contents into an  integer
  1350.                            array using the SCRNSAVE routine.
  1351.  
  1352.                         3) Place the new window on  the  screen  using
  1353.                            the MAKEWINDOW routine.  You can then print
  1354.                            any text inside the window you need.
  1355.  
  1356.                                                                page 93
  1357.  
  1358.  
  1359.  
  1360.  
  1361.                         4) As  soon  as  you  are  finished  with  the
  1362.                            window, you can restore the original screen
  1363.                            contents, thus popping the window  off  the
  1364.                            display, using the SCRNRESTORE routine.
  1365.  
  1366.                    The  use  of  windows  is  extremely   useful   for
  1367.                    isolating  a single thought, concept or activity on
  1368.                    your display screen.   Using  this  technique  will
  1369.                    allow  you  to  use  windows  while  retaining  the
  1370.                    integrity of  the  underlying  screen.   This  will
  1371.                    result  in  much  faster execution time and happier
  1372.                    users, since you and they don't  have  to  wait  to
  1373.                    redraw the whole screen.
  1374.  
  1375.                    We'll  now  go  through  a practical example of the
  1376.                    entire process.  To use  an  earlier  example,  our
  1377.                    task  is  to display an error message in the middle
  1378.                    whatever screen currently exists  on  the  display.
  1379.                    Who  knows  when  an  error  will come up?  We will
  1380.                    assume that  there  is  some  sort  of  event  that
  1381.                    triggers  the  error  -  we're  only going to worry
  1382.                    about displaying the error in  a  window  and  then
  1383.                    restoring the display.  Other assumptions are:
  1384.  
  1385.                         1) The error message will never be more than 5
  1386.                            lines  long,  each  of  which  will  be  60
  1387.                            characters  or  less in length.  This means
  1388.                            we will need 7 display lines  (5  lines  of
  1389.                            error text + 2 lines for the window frame).
  1390.  
  1391.                         2) The user will hit a key to clear the  error
  1392.                            message window from the screen,  signifying
  1393.                            that they are finished reading it.
  1394.  
  1395.                         3) The software will be  running  on  a  color
  1396.                            display.
  1397.  
  1398.                         4) There will be a routine called ErrorMessage
  1399.                            that  will  place  the appropriate text for
  1400.                            the error message inside our window.
  1401.  
  1402.                    So  let's begin our example.  The code here will be
  1403.                    commented  well  so  that  it   is   clear   what's
  1404.                    happening.
  1405.  
  1406.                    ' Window display/removal example begins
  1407.                    ' Dimension an array to store screen contents
  1408.                    DIM scrArray%(4000)
  1409.  
  1410.  
  1411.  
  1412.  
  1413.  
  1414.  
  1415.                                                                page 94
  1416.  
  1417.  
  1418.  
  1419.  
  1420.                    ' Save the portion of the screen we will be
  1421.                    ' overwriting.  Our window will  always  be
  1422.                    ' located between rows 10 and 16.  First
  1423.                    ' though, we need the proper video segment.
  1424.                    segment = GetVideoSegment
  1425.  
  1426.                    ' Now we can save the portion of the screen we will
  1427.                    ' be overwriting.
  1428.                    ScrnSave 10, 16, scrArray%(), segment
  1429.  
  1430.                    ' We've now paid our insurance - lets display the
  1431.                    ' error message window.  We will assign our window
  1432.                    ' parameters as variables for readability.
  1433.                    leftCol = 8: rightCol = 73
  1434.                    topRow = 10: botRow = 16
  1435.                    foreColor% = 15    ' Bright White
  1436.                    backColor% = 4     ' Red
  1437.                    windowType% = 0    ' Normal window, no inside lines
  1438.                    frameType% = 1     ' All double lines
  1439.                    shadowColor% = 0   ' Black window shadow
  1440.                    explodeType% = 1   ' Automatic explode mode
  1441.                    label$ = " Error! "
  1442.  
  1443.                    ' Make the window on the screen.  Note that in your
  1444.                    ' real program this next statement would be on a
  1445.                    ' single line.
  1446.                    MakeWindow topRow, leftCol, BotRow, rightCol,
  1447.                               foreColor%, backColor%, windowType%,
  1448.                               frameType%, shadowColor%, explodeType%,
  1449.                               label$
  1450.  
  1451.                    ' Add the error text to the window.  We will assume
  1452.                    ' that there is a routine called ErrorMessage  that
  1453.                    ' will place the correct message at the right  spot
  1454.                    ' on the screen.
  1455.                    ErrorMessage
  1456.  
  1457.                    ' Wait for the user to hit a key,  signifying  that
  1458.                    ' they are finished with the message.
  1459.                    keyPress$ = INPUT$(1)
  1460.  
  1461.                    ' Now  that  the user is done, we will restore  the
  1462.                    ' screen to the state it was in  before  the  error
  1463.                    ' message window was displayed using SCRNRESTORE.
  1464.                    ScrnRestore 10, 16, scrArray%(), segment
  1465.  
  1466.                    ' Window display/removal example ends
  1467.  
  1468.                    Note  that  you  should  only  save and restore the
  1469.                    smallest amount of the screen as you need to. Doing
  1470.                    so will result in much faster performance.
  1471.  
  1472.  
  1473.  
  1474.                                                                page 95
  1475.  
  1476.  
  1477.  
  1478.  
  1479.                    This  technique  can  be  used for multiple windows
  1480.                    simultaneously by having an integer array for  each
  1481.                    window  you  place  on the screen.  Save the screen
  1482.                    with a new array each time you add a new window  to
  1483.                    the screen.  In this way, you can reverse the order
  1484.                    when  you  restore screens, and the windows will be
  1485.                    removed from the display one at a time in order.
  1486.  
  1487.  
  1488.  
  1489.  
  1490.  
  1491.  
  1492.  
  1493.  
  1494.  
  1495.  
  1496.  
  1497.  
  1498.  
  1499.  
  1500.  
  1501.  
  1502.  
  1503.  
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.  
  1523.  
  1524.  
  1525.  
  1526.  
  1527.  
  1528.  
  1529.  
  1530.  
  1531.  
  1532.  
  1533.                                                                page 96
  1534.  
  1535.  
  1536.  
  1537.  
  1538.          Visual Effects with BUILDSCREEN and CLRSCR
  1539.          -------------------------------------------------------------
  1540.  
  1541.                    BuildScreen and ClrScr are complimentary  routines.
  1542.                    Although one creates screens and the other destroys
  1543.                    them, they perform these tasks in the same way.  If
  1544.                    you  look  at  the  source  code  for each routine,
  1545.                    you'll  see  that  they  are  very  similar.   Each
  1546.                    routine  also  supports  exactly  the same modes of
  1547.                    animation.  ClrScr mode 10, for example, will clear
  1548.                    the screen in a spiral fashion,  while  BuildScreen
  1549.                    mode  10  displays  a  screen  in  the  same spiral
  1550.                    fashion.
  1551.  
  1552.                    Since the modes of animation are the same for  each
  1553.                    routine,  they  can  be  used  together  to  create
  1554.                    interesting visual effects.  A perfect  example  is
  1555.                    demonstrated  in  the  DEMO  program.  This example
  1556.                    uses complimentary ClrScr and BuildScreen routines.
  1557.                    ClrScr is used to  first  clear  the  screen  using
  1558.                    ASCII   character   176  (░)  with  mode  3,  which
  1559.                    resembles curtains closing on  a  stage.   Then the
  1560.                    display  is  placed on the screen using BuildScreen
  1561.                    mode 2, which is the complimentary opposite mode of
  1562.                    mode 3 just used with  ClrScr.   The  effect  looks
  1563.                    likes curtains closing on the existing display, and
  1564.                    the curtains open again revealing the new display.
  1565.  
  1566.                    Techniques  like  this  can be generated easily for
  1567.                    opening screens of programs or other displays.  For
  1568.                    details on the example  described  above,  see  the
  1569.                    source code for the DEMO program.  Other modes that
  1570.                    match  well  can be used to create similar effects.
  1571.                    Use the REF program  to  see  all  the  ClrScr  and
  1572.                    BuildScreen  modes.   By  playing around a bit, you
  1573.                    may discover an impressive way  to  open  your  own
  1574.                    program.
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590.  
  1591.  
  1592.                                                                page 97
  1593.  
  1594.  
  1595.  
  1596.  
  1597.          Window Making Techniques
  1598.          -------------------------------------------------------------
  1599.  
  1600.                    Creating a "Frameless" Window
  1601.                    ---------------------------------------------------
  1602.                    Sometimes you don't want a border, or frame, around
  1603.                    your  window.   You just want a colored field.  You
  1604.                    can do this two ways.
  1605.  
  1606.                    The  first  and  most  obvious method is to use the
  1607.                    MakeWindow routine.  You  can  do  this  easily  by
  1608.                    making   the   foreground   and   background  color
  1609.                    parameters the same value.   If  for  instance  you
  1610.                    wanted  to make a red frameless window, simply make
  1611.                    the foreColor and backColor parameters the same, in
  1612.                    our case, 4.  It doesn't matter what the  frameType
  1613.                    or  windowType  parameters  are since you won't see
  1614.                    them.  Choose any valid value such as zero for both
  1615.                    parameters.
  1616.  
  1617.                    The drawback with this technique is that  you  must
  1618.                    provide  all the MakeWindow parameters.  There is a
  1619.                    shortcut for creating a frameless window.   You  do
  1620.                    so by using the Wipe routine.  Simply pass Wipe the
  1621.                    coordinates  for  your  window  and a color for the
  1622.                    field.  This results in the much easier creation of
  1623.                    a frameless window.
  1624.  
  1625.                    Of course, if you want a shadow for the window,  or
  1626.                    you  want  it to explode onto the screen, the first
  1627.                    option is your best bet.  Frameless windows, by the
  1628.                    way, look great with a black shadow.
  1629.  
  1630.  
  1631.                    Window Shadows
  1632.                    ---------------------------------------------------
  1633.                    And speaking of window shadows, the new shadow mode
  1634.                    that  MakeWindow  incorporates  will add a definite
  1635.                    touch of professionalism to any program  that  uses
  1636.                    windows.
  1637.  
  1638.                    The  new shadow types are 16 and 17, and will leave
  1639.                    existing characters in the shadowed region  on  the
  1640.                    screen.   It will, however, change the color of the
  1641.                    characters so they are in  plain  white  (for  mode
  1642.                    16),  or  low-intensity versions of existing colors
  1643.                    (using mode 17). This is exactly the same shadowing
  1644.                    that the QuickBASIC environment uses (mode 16), and
  1645.                    looks very sharp. If you plan  to  be  using  color
  1646.                    displays,  then  seriously  consider  either shadow
  1647.                    mode.
  1648.  
  1649.  
  1650.  
  1651.                                                                page 98
  1652.  
  1653.  
  1654.  
  1655.  
  1656.          Menu Techniques
  1657.          -------------------------------------------------------------
  1658.  
  1659.                    Producing a Clear and Clean Menu
  1660.                    ---------------------------------------------------
  1661.                    When  generating  menus  for  a person to use, it's
  1662.                    important to keep a couple of  design  concepts  in
  1663.                    mind.
  1664.  
  1665.                    Your  menus  should  be easy to use and understand.
  1666.                    This means keeping the  menu  focused  without  too
  1667.                    many  choices.   Users  tend to work best when they
  1668.                    have nine or fewer choices to decide between.   The
  1669.                    choices  themselves should be concise yet distinct.
  1670.                    There  shouldn't  be  any  question  about  what  a
  1671.                    particular  entry  does.   You can accomplish these
  1672.                    goals by giving your entries careful thought.  Make
  1673.                    sure each is meaningful, and keep your menu choices
  1674.                    to as few as possible.
  1675.  
  1676.                    There are specific things you can do with the QBSCR
  1677.                    MakeMenu function to further these aims.
  1678.  
  1679.                         1) Keep your menu entries  to  a  minimum  and
  1680.                            make sure they are clear.
  1681.  
  1682.                         2) Use "Quick Access" keys to make your  menus
  1683.                            easier   to   use.   By  providing  both  a
  1684.                            selection bar and Quick  Access  keys,  you
  1685.                            satisfy  the  needs  of both the novice and
  1686.                            the advanced user.
  1687.  
  1688.                         3) Choose your Quick  Access  Keys  carefully.
  1689.                            Specifically,  choose ones that are easy to
  1690.                            remember.  For instance, if your  entry  is
  1691.                            "Save File,"  the S would make an excellent
  1692.                            Quick   Access  key,  since  S  is  closely
  1693.                            related to  the  primary  function  of  the
  1694.                            entry,  Saving  a  file.  The V wouldn't be
  1695.                            terrible, but the F  would  be  the  worst,
  1696.                            since  you  might also have "Edit File" and
  1697.                            "Load  File"  entries.   The  F  would  not
  1698.                            distinguish  the  Save function from any of
  1699.                            the other file operations.
  1700.  
  1701.                         4) Always provide  on-screen  instructions  on
  1702.                            how to use the menu.
  1703.  
  1704.  
  1705.  
  1706.  
  1707.  
  1708.  
  1709.  
  1710.                                                                page 99
  1711.  
  1712.  
  1713.  
  1714.  
  1715.                         5) Keep your menus clean.  Isolate  them  from
  1716.                            any  other  distracting screen information.
  1717.                            You can do this by
  1718.  
  1719.                                 a) choosing a location on  the  screen
  1720.                                    that is as removed as possible from
  1721.                                    other  information  on  the screen,
  1722.                                    and
  1723.  
  1724.                                 b) placing your menu inside a window.
  1725.  
  1726.                            If you place your menu inside a window,  it
  1727.                            isolates  the  menu  even  further from the
  1728.                            rest of the world.  This will help the user
  1729.                            focus on the menu and the  decision  to  be
  1730.                            made there.
  1731.  
  1732.                    While  all these ideas may sound odd or picky, they
  1733.                    all  come  together  to  make   your   menus   more
  1734.                    presentable,  easy  to  use,  and professional. The
  1735.                    user may not be thinking "Wow, this menu is  nicely
  1736.                    isolated  and  that  makes it easier for me to deal
  1737.                    with," but it inherently will  be.   Their  overall
  1738.                    impression  will  be  more  favorable, even if they
  1739.                    don't  specifically know why.  They should at least
  1740.                    get  the  impression  that  the  program  is   well
  1741.                    organized.
  1742.  
  1743.  
  1744.  
  1745.  
  1746.  
  1747.  
  1748.  
  1749.  
  1750.  
  1751.  
  1752.  
  1753.  
  1754.  
  1755.  
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765.  
  1766.  
  1767.  
  1768.  
  1769.                                                               page 100
  1770.  
  1771.  
  1772.  
  1773.  
  1774.          Cross Reference - Routine Dependencies
  1775.          -------------------------------------------------------------
  1776.  
  1777.                    To make code more  efficient,  some  of  the  QBSCR
  1778.                    routines  make  use of each other's services.  This
  1779.                    section of the documentation  will  detail  exactly
  1780.                    what routines are dependent on others, and on which
  1781.                    ones.   Consult this table carefully if you plan to
  1782.                    be pruning off  routines  your  particular  program
  1783.                    will not be using.
  1784.  
  1785.                    Also  note that there are two routines in the QBSCR
  1786.                    package that are not documented except here.   They
  1787.                    are   the   function  SubMenu  and  the  subprogram
  1788.                    DisplayEntry.  They are  used  only  internally  by
  1789.                    other routines, which are detailed below.
  1790.  
  1791.                    Routine...                       ...is dependent on
  1792.                    ---------------------------------------------------
  1793.                    Banner . . . . . . . . . . . . . . . . . . . . none
  1794.                    BlockRestore . . . . . . . . . . . . . . . . . none
  1795.                    BlockSave  . . . . . . . . . . . . . . . . . . none
  1796.                    BlockSize  . . . . . . . . . . . . . . . . . . none
  1797.                    BuildScreen  . . . . . . . . . . .  GetVideoSegment
  1798.                    Center . . . . . . . . . . . . . . . . . . . . none
  1799.                    ClrScr . . . . . . . . . . . . . . . . . . . . none
  1800.                    ColorChk . . . . . . . . . . . . . . . . . . . none
  1801.                    DisplayEntry . . . . . . . . . . . . . . . . . none
  1802.                    EditString . . . . . . . . . . . . . . . . ColorChk
  1803.                    GetBackground  . . . . . . . . . .  GetVideoSegment
  1804.                    GetForeground  . . . . . . . . . .  GetVideoSegment
  1805.                    GetScreen  . . . . . . . . . . . .  GetVideoSegment
  1806.                    GetVideoSegment  . . . . . . . . . . . . . . . none
  1807.                    MakeMenu . . . . . . . . . . . . . . . DisplayEntry
  1808.                    MakeWindow . . . . . . . . . . . .  GetVideoSegment
  1809.                    MultiMenu  . . . . . . . . . . . . . . BlockRestore
  1810.                                                              BlockSave
  1811.                                                           DisplayEntry
  1812.                                                        GetVideoSegment
  1813.                                                             MakeWindow
  1814.                                                                SubMenu
  1815.                    OffCenter  . . . . . . . . . . . . . . . . . . none
  1816.                    PutScreen  . . . . . . . . . . . .  GetVideoSegment
  1817.                    QBPrint  . . . . . . . . . . . . .  GetVideoSegment
  1818.                    ScreenBlank  . . . . . . . . . . . . . . . . . none
  1819.                    ScrnRestore  . . . . . . . . . . . . . . . . . none
  1820.                    ScrnSave . . . . . . . . . . . . . . . . . . . none
  1821.                    SelectList . . . . . . . . . . . . . . . . . . none
  1822.                    SubMenu  . . . . . . . . . . . . . . . DisplayEntry
  1823.                    ViewList . . . . . . . . . . . . . . . . . . . none
  1824.                    Wipe . . . . . . . . . . . . . . . . . . . . . none
  1825.  
  1826.  
  1827.  
  1828.                                                               page 101
  1829.  
  1830.  
  1831.  
  1832.  
  1833.          Closing Notes
  1834.          -------------------------------------------------------------
  1835.  
  1836.                    I sincerely hope that the QBSCR Screen Routines are
  1837.                    of some help to you, either in a productivity or  a
  1838.                    tutorial  capacity.   The Screen Routines try their
  1839.                    best to fill both roles.
  1840.  
  1841.                    The BAD SOFTWARE Company has two  missions  in  the
  1842.                    world  of  software for the IBM PC and compatibles.
  1843.                    The first is to provide useful software that's easy
  1844.                    to use.  The primary purpose  of  any  software  is
  1845.                    that it does something you want or need. Therefore,
  1846.                    BAD  SOFTWARE  is  dedicated  to the development of
  1847.                    software that has these qualities.  But the  second
  1848.                    item of importance to BAD SOFTWARE is that software
  1849.                    be  fun.   Computing  need not be a chore to avoid.
  1850.                    The QBSCR Screen Routines  hopefully  fulfill  this
  1851.                    requirement.   It's  always been fun for me to make
  1852.                    my own programs appear as professional as possible,
  1853.                    and the  Screen  Routines  let  me  do  this  while
  1854.                    expending  very little time and effort.  I can only
  1855.                    hope that they will do the same for you.
  1856.  
  1857.                    If you have any comments or ideas about the  Screen
  1858.                    Routines,  please  feel free to drop me a letter at
  1859.                    the following address.  I'll do my best  to  answer
  1860.                    all correspondence.
  1861.  
  1862.                                        Tony Martin
  1863.                                  1611 Harvest Green Ct.
  1864.                                     Reston, VA 22090
  1865.  
  1866.                    Lastly,   I  must  acknowledge  a  few  copyrights.
  1867.                    Microsoft  and   QuickBASIC   are   trademarks   of
  1868.                    Microsoft  Corporation.   I'm  sure you didn't know
  1869.                    this...
  1870.  
  1871.  
  1872.  
  1873.  
  1874.  
  1875.  
  1876.  
  1877.  
  1878.  
  1879.  
  1880.  
  1881.  
  1882.  
  1883.  
  1884.  
  1885.  
  1886.  
  1887.                                                               page 102
  1888.  
  1889.  
  1890.  
  1891.  
  1892.          Registration Form
  1893.          -------------------------------------------------------------
  1894.  
  1895.                    If  you  decide  to  register  the   QBSCR   Screen
  1896.                    Routines,  send a check for $15.00 U.S. made out to
  1897.                    Tony Martin to:
  1898.  
  1899.                                        Tony Martin
  1900.                                  1611 Harvest Green Ct.
  1901.                                     Reston, VA 22094
  1902.  
  1903.                    In  return  I  will  send  you an official disk set
  1904.                    containing all the files of the latest  version  of
  1905.                    the  Screen Routines.  In addition you will receive
  1906.                    a free copy of the LASER II graphics  entertainment
  1907.                    program  written  by  BAD  SOFTWARE exclusively for
  1908.                    registered users of BAD SOFTWARE products.
  1909.  
  1910.                    ---------------------------------------------------
  1911.  
  1912.                    Complete this registration form and send with  your
  1913.                    check to the above listed address.
  1914.  
  1915.                    Product: QBSCR Screen Routines
  1916.  
  1917.                    Version: 1.6
  1918.  
  1919.                    Cost $15.00
  1920.  
  1921.                    Quantity: ________
  1922.  
  1923.                    Total: $__________
  1924.  
  1925.                    Ship to:
  1926.  
  1927.                    Name: _____________________________________________
  1928.  
  1929.                    Address: __________________________________________
  1930.  
  1931.                    City/State/Zip: ___________________________________
  1932.  
  1933.  
  1934.  
  1935.  
  1936.  
  1937.  
  1938.  
  1939.  
  1940.  
  1941.  
  1942.  
  1943.  
  1944.  
  1945.  
  1946.                                                               page 103
  1947.  
  1948.  
  1949.